【1】对于实参和形参的区别，可以简单的理解为：
形参：函数定义时的参数-也就是无赋值的变量（作用是说明参数的类型）
实参：调用函数时使用的参数-也就是有赋值的变量（函数实际操作的对象）
【2】
函数三要素包括：函数名，调用参数，返回类型
第一步：实参初始化函数对应的参数。
第二步：将控制权转移给背调函数。
实参的类型必须和形参相匹配。
即使函数只有一条语句也需要花括号。
【3】局部对象
函数体是一个语句块，块构成一个新的作用域，我们可以在其定义变量。形参和函数体内部定义的变量统称为局部变量。
它们对函数而言是“局部的”，仅在函数的作用域内可见，同时局部变量还会隐藏在外层作用域同名的其他所有声明中。
在所有函数体之外定义的对象存在于程序的整个执行过程中。此类对象在程序启动时被创建，直到程序结束时才销毁。
【4】自动对象
把只存在于块执行期间的对象称为自动对象。
【5】局部静态对象
在程序的执行路径中第一次经过对象定义语句时初始化，并且直到程序终止时才被销毁，在此期间即使对象所在的函数结束执行也不会对它有影响。
【6】使用引用避免拷贝
拷贝大的类类型对象或者容器对象比较低效，甚至有的类类型（包括IO类型在内）
根本就不支持拷贝操作。当某种类型不支持拷贝操作时，函数只能通过引用形参访问该类
类型的对象。
举个例子，比较两个string大小，如果长度太长可以避免直接拷贝，因此使用引用形参
bool IsShort(const string &s1, const string &s2)
{
  return s1.size() < s2.size();
}
【7】使用形参返回额外信息
给函数传入一个额外的引用实参
int c;
int find_char(const string &s,char c,int &occurs)
{
    auto ret = s.size();
    occurs = 0;
    int index = 0;
    for(int i=0; i<ret; ++i)
    {
        if(s[i]==c)
        {
            index = i;
            break;
        }
    }
    for(int i=0; i<ret; ++i)
    {
        if(s[i]==c)
        {
            ++occurs;
        }
    }
    return index;
}
int main()
{
    string s="abcdefac";
    cout<<find_char(s,'c',c)<<endl;
    cout<<c<<endl; 
    return 0;
}
